package design.mode.proxy.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 代理主题角色：也叫做委托类、代理类，该角色负责控制对真实主题的引用，<br/>
 * 负责在需要的时候创建或删除真实主题对象，并且在真实主题角色处理完毕前后做预处理和善后处理工作
 * <br/>
 * 使用jdk自带的实现，实际可以使用asm/cglib/javassist/byte buddy等进行相应实现（asm性能最好，但同时学习成本也较高）
 */
public class MyProxy implements InvocationHandler {

    private Object obj;

    public MyProxy(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("rootnet 设计模式演示：proxy before");
        // result是方法的返回值
        Object result = method.invoke(obj, args);
        System.out.println("rootnet 设计模式演示：proxy after");
        return result;
    }
}
